"""
数据交互
"""
import os.path
import pickle

from conf.settings import USER_DIR


def save_data(obj):
    """保存文件"""
    file_dir = os.path.join(USER_DIR, obj.__class__.__name__)  # 拼接类名作为对应对象文件存储的目录
    if not os.path.exists(file_dir):  # 如果目录不存在创建文件夹
        os.mkdir(file_dir)

    # 使用对象的name作为文件名
    file_abspath = os.path.join(file_dir, f'{obj.name}.pickle')  # 拼接文件路径
    with open(file_abspath, 'wb') as f:
        pickle.dump(obj, f)  # 序列化为pickle文件


def read_data(name: str, class_name: str):
    """
    读取文件
    :param name: 对象名（文件名）
    :param class_name: 类名（文件夹名）
    :return: 传入的类名的类的对象
    """
    file_abspath = os.path.join(USER_DIR, class_name, f'{name}.pickle')  # 拼接文件路径
    with open(file_abspath, 'rb') as f:
        obj = pickle.load(f)  # 反序列化为python对象
    return obj


def get_all(class_name: str) -> list:
    """
    获取类的对象
    :param class_name: 类名（文件夹名）
    :return: 对象列表
    """
    obj_list = []
    file_dir = os.path.join(USER_DIR, class_name)  # 拼接目标文件
    if not os.path.exists(file_dir):  # 如果目录不存在创建文件夹
        os.mkdir(file_dir)

    file_list = os.listdir(file_dir)  # 获取文件列表

    for filename in file_list:  # 依次读取所有文件
        file_abspath = os.path.join(file_dir, filename)
        with open(file_abspath, 'rb') as f:
            obj_list.append(pickle.load(f))  # 将对象添加到列表

    return obj_list


def is_file_exist(name: str, class_name: str) -> bool:
    """
    文件是否存在
    :param name: 对象名（文件名）
    :param class_name: 类名（文件夹名）
    :return: 布尔值
    """
    file_dir = os.path.join(USER_DIR, class_name)  # 拼接类名作为对应对象文件存储的目录
    if not os.path.exists(file_dir):  # 如果目录不存在
        return False
    file_abspath = os.path.join(file_dir, f'{name}.pickle')  # 拼接文件路径
    if not os.path.exists(file_abspath):  # 如果文件不存在
        return False
    return True  # 文件存在
